/**
 * 本地存储工具类
 */
export class StorageUtil {
  postfix:string = "_expiry"; // 缓存有效期后缀

  /**
   * 设置本地存储项，支持设置过期时间
   * @param key 存储键
   * @param value 存储值
   * @param expiryTime 过期时间，单位为秒，若不传入则不过期
   */
  public static setLocalStorage(key: string, value: any, expiryTime?: number): void {
    uni.setStorageSync(key, value);
    const seconds = parseInt(expiryTime as unknown as string);
    if (seconds > 0) {
// 原代码中 Date.parse 期望接收一个字符串类型的参数，而 new Date() 返回的是 Date 对象，因此会报错。
// 修改为直接调用 Date.now() 方法来获取当前时间的时间戳，避免了类型不匹配的问题。
let timestamp = Date.now();
      timestamp = timestamp / 1000 + seconds;
      // 原代码 `this.postfix` 错误，因为 `setLocalStorage` 是静态方法，`this` 指向类本身，而 `postfix` 是实例属性。
      // 这里创建一个 `StorageUtil` 实例，通过实例访问 `postfix` 属性。
      const storageUtil = new StorageUtil();
      uni.setStorageSync(key + storageUtil.postfix, timestamp + '');
    } else {
      const storageUtil = new StorageUtil();
      uni.removeStorageSync(key + storageUtil.postfix);
    }
  }

  /**
   * 获取本地存储项
   * @param key 存储键
   * @param def 获取为空时默认值
   * @returns 存储值，如果不存在或已过期则返回默认值
   */
  public static getLocalStorage(key: string, def?: any): any {
    // 原代码中 `this.postfix` 错误，因为 `getLocalStorage` 是静态方法，`this` 指向类本身，而 `postfix` 是实例属性。
    // 这里创建一个 `StorageUtil` 实例，通过实例访问 `postfix` 属性。
    const storageUtil = new StorageUtil();
    const deadtime = parseInt(uni.getStorageSync(key + storageUtil.postfix));
    if (deadtime) {
      // 原代码中 parseInt 函数期望接收一个字符串类型的参数，而 deadtime 已经是 number 类型，不需要再使用 parseInt 进行转换
      if (deadtime < Date.now() / 1000) {
        if (def) {
          return def;
        } else {
          return false;
        }
      }
    }
    const res = uni.getStorageSync(key);
    if (res) {
      return res;
    }
    if (def === undefined || def === "") {
      def = false;
    }
    return def;
  }

  /**
   * 删除本地存储项
   * @param key 存储键
   */
  public static removeLocalStorage(key: string): void {
    uni.removeStorageSync(key);
    // 原代码 `this.postfix` 错误，因为 `removeLocalStorage` 是静态方法，`this` 指向类本身，而 `postfix` 是实例属性。
    // 这里创建一个 `StorageUtil` 实例，通过实例访问 `postfix` 属性。
    const storageUtil = new StorageUtil();
    uni.removeStorageSync(key + storageUtil.postfix);
  }

  /**
   * 设置会话存储项，支持设置过期时间
   * 这里复用本地存储逻辑，因为原js示例未区分会话存储逻辑
   * @param key 存储键
   * @param value 存储值
   * @param expiryTime 过期时间，单位为秒，若不传入则不过期
   */
  public static setSessionStorage(key: string, value: any, expiryTime?: number): void {
    this.setLocalStorage(key, value, expiryTime);
  }

  /**
   * 获取会话存储项
   * 这里复用本地存储逻辑，因为原js示例未区分会话存储逻辑
   * @param key 存储键
   * @param def 获取为空时默认值
   * @returns 存储值，如果不存在或已过期则返回默认值
   */
  public static getSessionStorage(key: string, def?: any): any {
    return this.getLocalStorage(key, def);
  }

  /**
   * 删除会话存储项
   * 这里复用本地存储逻辑，因为原js示例未区分会话存储逻辑
   * @param key 存储键
   */
  public static removeSessionStorage(key: string): void {
    this.removeLocalStorage(key);
  }

  /**
   * 清理所有本地存储和会话存储（这里都用uni.clearStorageSync）
   */
  public static clear(): void {
    uni.clearStorageSync();
  }
}